"""
MCP 时间服务命令行入口模块

功能：
- 使用 FastMCP SDK (mcp.server.fastmcp) 实现。
- 通过 mcp_server.tool() 装饰器注册 `get_current_datetime` 工具。
- 自动处理 MCP 协议的 JSON-RPC 消息和生命周期（如 initialize）。
- 通过 stdio 提供服务。

版本历史：
2.0.1 (2025-05-16) - 修改 get_current_datetime 工具的时间输出格式为 YYYY-MM-DD。
2.0.0 (2025-05-16) - 重构为使用 FastMCP SDK，简化了实现并解决了通信问题。
1.1.1a (2025-05-16) - 尝试移除 capabilities.tools 以匹配SDK行为（调试）。
1.1.1 (2025-05-16) - 尝试调整 capabilities.tools 结构（调试）。
1.1.0 (2025-05-16) - 尝试调整 initialize 响应结构（调试）。
1.0.5 (2025-05-16) - 尝试修复 capabilities 结构（调试）。
1.0.4 (2025-05-16) - 修复linter错误，调整日志输出（手动实现）。
1.0.1 (2025-05-15) - 完善错误处理机制（手动实现）。
1.0.0 (2025-05-14) - 初始版本（手动实现）。

文档生成时间：2025-05-16
"""

import sys
from mcp.server.fastmcp import FastMCP
from datetime import datetime


# 自定义异常，如果工具执行中发生特定错误并希望传递特定信息时使用。
# FastMCP 会将工具执行期间未捕获的异常转换为通用的 MCP 错误。
class TimeToolError(Exception):
    pass


print("MCP Time Server (FastMCP v2.0.0): Starting", file=sys.stderr)
sys.stderr.flush()

try:
    # 初始化 FastMCP 服务器实例
    # name 和 version 会出现在 serverInfo 中
    # FastMCP 会自动处理 initialize 握手和 capabilities 的声明
    mcp_server = FastMCP(
        name="My MCP Time Server",
        version="2.0.0",
    )
    print("MCP Time Server (FastMCP v2.0.0): Instance created.", file=sys.stderr)
    sys.stderr.flush()
except Exception as e:
    print(
        f"MCP Time Server (FastMCP v2.0.0): Error creating instance: {e}",
        file=sys.stderr,
    )
    sys.stderr.flush()
    # 如果 FastMCP 实例创建失败，脚本无法继续
    sys.exit(1)


@mcp_server.tool()
def get_current_datetime():
    """
    (FastMCP Server) 获取当前的日期。
    此工具没有输入参数。
    返回一个包含 'current_time' 键（值为 'YYYY-MM-DD' 格式的日期字符串）的字典。
    """
    print("MCP Time Server (v2.0.0): get_current_datetime called", file=sys.stderr)
    sys.stderr.flush()
    try:
        now = datetime.now()
        # 工具函数直接返回其结果数据。
        # FastMCP 会自动将此 Python 字典包装在符合 JSON-RPC 规范的 result 字段中。
        return {"current_time": now.strftime("%Y-%m-%d")}
    except Exception as e:
        # 记录服务器端发生的原始错误。
        print(f"MCP Time Server (FastMCP v2.0.0): Error in tool: {e}", file=sys.stderr)
        sys.stderr.flush()
        # 重新抛出异常（或抛出自定义的 TimeToolError）。
        # FastMCP 会捕获此异常并将其转换为标准的 MCP 错误响应发送给客户端。
        raise TimeToolError(f"Error in get_current_datetime: {str(e)}")


def main():
    print("MCP Time Server (FastMCP v2.0.0): Main function start.", file=sys.stderr)
    sys.stderr.flush()
    exit_code = 0
    try:
        print(
            "MCP Time Server (FastMCP v2.0.0): Calling mcp_server.run()",
            file=sys.stderr,
        )
        sys.stderr.flush()
        mcp_server.run(transport="stdio")
        print(
            "MCP Time Server (FastMCP v2.0.0): mcp_server.run() exited normally.",
            file=sys.stderr,
        )
        sys.stderr.flush()
    except SystemExit as e:
        exit_code = e.code if isinstance(e.code, int) else 1
        print(
            f"MCP Time Server (v2.0.0): SystemExit caught, code {exit_code}.",
            file=sys.stderr,
        )
        sys.stderr.flush()
        # Re-raise to allow proper exit, but ensure main() returns the code
        # sys.exit(exit_code) # Avoid direct sys.exit in a library function
        return exit_code
    except KeyboardInterrupt:
        print(
            "MCP Time Server (FastMCP v2.0.0): KeyboardInterrupt received, exiting.",
            file=sys.stderr,
        )
        sys.stderr.flush()
        exit_code = 1  # Standard exit code for SIGINT
    except Exception as e:
        print(
            f"MCP Time Server (FastMCP v2.0.0): Unhandled error in main run: {e}",
            file=sys.stderr,
        )
        sys.stderr.flush()
        exit_code = 1
    finally:
        print(
            f"MCP Time Server (v2.0.0): Finally, exit code {exit_code}.",
            file=sys.stderr,
        )
        sys.stderr.flush()

    print(f"MCP Time Server (v2.0.0): main returning {exit_code}.", file=sys.stderr)
    sys.stderr.flush()
    return exit_code


if __name__ == "__main__":
    sys.exit(main())
